from flask import current_app
from flask import g, jsonify
from flask import redirect
from flask import request
from flask import session

from info import constants
from info import db
from info.models import User, News, Category
from info.utils.commons import user_login_data
from info.utils.image_storage import image_storage
from info.utils.response_code import RET
from . import profile_blue
from flask import render_template

@profile_blue.route('/user_follow')
@user_login_data
def user_follow():
    page = request.args.get("p", "1")

    try:
        page = int(page)
    except Exception as e:
        current_app.logger.error(e)
        page = 1
    try:
        paginate = g.user.followed.paginate(page, 2, False)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR, errmsg="获取新闻失败")

    totalPage = paginate.pages
    currentPage = paginate.page
    items = paginate.items

    users_list = []
    for item in items:
        users_list.append(item.to_dict())

    data = {
        "totalPage": totalPage,
        "currentPage": currentPage,
        "users_list": users_list
    }

    return render_template("news/user_follow.html", data=data)


@profile_blue.route('/other_news_list')
def other_news_list():
    page = request.args.get("p","1")
    author_id = request.args.get("user_id")

    if not author_id: return jsonify(errno=RET.PARAMERR,errmsg = "参数不全")
    try:
        page = int(page)
    except Exception as e:
        current_app.logger.error(e)
        page = 1

    try:
        author = User.query.get(author_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg = "获取参数失败")
    if not author: return jsonify(errno=RET.NODATA,errmsg = "作者不存在")
    try:
        # paginate = News.query.filter(News.user_id == author_id).order_by(News.create_time.desc()).paginate(page,10,False)
        paginate = author.news_list.order_by(News.create_time.desc()).paginate(page,5,False)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg = "获取新闻失败")

    total_page = paginate.pages
    current_page = paginate.page
    items = paginate.items

    news_list = []

    for item in items:
        news_list.append(item.to_dict())
    data = {
        "total_page" : total_page,
        "current_page" : current_page,
        "news_list" : news_list
    }

    return jsonify(errno=RET.OK,errmsg = "获取成功",data =data)


@profile_blue.route('/other')
@user_login_data
def other():
    author_id = request.args.get("id")
    if not author_id:
        return jsonify(errno=RET.PARAMERR,errmsg = "参数不全")
    try:
        author = User.query.get(author_id)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg = "获取作者失败")
    if not author: return jsonify(errno=RET.NODATA,errmsg = "作者不存在")

    is_followed = False
    if g.user:
        if g.user in author.followers:
            is_followed = True
    data = {
        "author" : author.to_dict(),
        "user_info" : g.user.to_dict() if g.user else "",
        "is_followed" : is_followed
    }
    return render_template("news/other.html",data = data)




@profile_blue.route('/news_list')
@user_login_data
def news_list():
    page = request.args.get("p","1")

    try:
        page = int(page)
    except Exception as e:
        current_app.logger.error(e)
        page = 1
    try:
        paginate = News.query.filter(News.user_id == g.user.id).order_by(News.create_time.desc()).paginate(page,4,False)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg = "获取新闻失败")

    totalPage = paginate.pages
    currentPage = paginate.page
    items = paginate.items

    news_list = []
    for item in items:
        news_list.append(item.to_review_dict())

    data = {
        "totalPage" : totalPage,
        "currentPage":currentPage,
        "news_list":news_list
    }

    return render_template("news/user_news_list.html",data = data)







@profile_blue.route('/news_release', methods=['GET', 'POST'])
@user_login_data
def news_release():
    if request.method == "GET":
        try:
            categories = Category.query.all()

        except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.DBERR,errmsg = "获取分类失败")

        category_list = []
        for category in categories:
            category_list.append(category.to_dict())
        return render_template("news/user_news_release.html",categories = category_list)

    title=request.form.get("title")
    category_id=request.form.get("category_id")
    digest=request.form.get("digest")
    index_image=request.files.get("index_image")
    content=request.form.get("content")

    if not all([title,category_id,digest,index_image,content]):
        return jsonify(errno=RET.PARAMERR,errmsg = "参数不全")
    try:
        image_name = image_storage(index_image.read())
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR,errmsg = "七牛云上传失败")
    if not image_name:return jsonify(errno=RET.NODATA,errmsg = "图片上传失败")
    news = News()
    news.title = title
    news.source = g.user.nick_name
    news.digest = digest
    news.content = content
    news.index_image_url = constants.QINIU_DOMIN_PREFIX + image_name
    news.category_id = category_id
    news.user_id = g.user.id
    news.status = 1
    try:
        db.session.add(news)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR,errmsg = "新闻发布失败")
    return jsonify(errno=RET.OK,errmsg = "新闻发布成功")







@profile_blue.route('/collection')
@user_login_data
def collection():
    page = request.args.get("p","1")

    try:
        page = int(page)
    except Exception as e:
        current_app.logger.error(e)
        page = 1
    try:
        paginate = g.user.collection_news.order_by(News.create_time.desc()).paginate(page,2,False)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg = "获取新闻失败")

    totalPage = paginate.pages
    currentPage = paginate.page
    items = paginate.items

    news_list = []
    for item in items:
        news_list.append(item.to_dict())

    data = {
        "totalPage" : totalPage,
        "currentPage":currentPage,
        "news_list":news_list
    }

    return render_template("news/user_collection.html",data = data)





@profile_blue.route('/pass_info', methods=['GET', 'POST'])
@user_login_data
def pass_info():
    if request.method == "GET":
        if not g.user:
            return redirect("127.0.0.1:5000")
        return render_template("news/user_pass_info.html")

    old_password=request.json.get("old_password")
    new_password=request.json.get("new_password")

    if not all([old_password,new_password]):
        return jsonify(errno=RET.PARAMERR,errmsg = "参数不全")

    if not g.user.check_password(old_password):
        return jsonify(errno=RET.DATAERR,errmsg = "原密码错误")

    g.user.password = new_password

    session.pop("user_id",None)
    session.pop("nick_name",None)
    session.pop("mobile",None)

    return jsonify(errno=RET.OK,errmsg = "修改成功")




@profile_blue.route('/pic_info', methods=['GET', 'POST'])
@user_login_data
def pic_info():
    if request.method=="GET":
        return render_template("news/user_pic_info.html",user = g.user.to_dict())

    avatar = request.files.get("avatar")
    print(avatar)

    if not avatar:
        return jsonify(errno=RET.PARAMERR,errmsg = "参数不全")

    try:
        image_name = image_storage(avatar.read())

    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR,errmsg = "七牛云上传异常")

    if not image_name: return jsonify(errno=RET.NODATA,errmsg = "图片上传失败")

    g.user.avatar_url = image_name

    data = {
        "avatar_url":constants.QINIU_DOMIN_PREFIX+image_name
    }

    return jsonify(errno=RET.OK,errmsg = "上传成功",data=data)









@profile_blue.route('/base_info', methods=['GET', 'POST'])
@user_login_data
def base_info():
    if request.method=="GET":
        return render_template("news/user_base_info.html",user = g.user.to_dict())
    signature = request.json.get("signature")
    nick_name = request.json.get("nick_name")
    gender = request.json.get("gender")

    if not all([signature,nick_name,gender]):
        return jsonify(errno=RET.PARAMERR,errmsg = "参数不全")
    if not gender in ["MAN","WOMAN"]:
        return jsonify(errno=RET.DATAERR,errmsg = "性别有误")

    try:
        g.user.nick_name=nick_name
        g.user.gender=gender
        g.user.signature=signature
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.DBERR,errmsg = "修改失败")

    return jsonify(errno=RET.OK,errmsg = "操作成功")



@profile_blue.route('/info')
@user_login_data
def user_info():

    if not g.user:
        return redirect("/")
    data = {
        "user_info":g.user.to_dict()
    }
    return render_template("news/user.html",data = data)